package tester;

import grafo.Arco;
import grafo.Grafo;
import grafo.Nodo;

import java.util.HashMap;
import java.util.HashSet;
import java.util.Map;
import java.util.Set;

import javax.swing.JOptionPane;

import junit.framework.TestCase;

public class GrafoTester extends TestCase {
	
	private Grafo grafo;
	private Map<Nodo, Nodo> ruta;
	private Set<Arco> solucion;

	public GrafoTester(String s) {
		super(s);
	}
	
	public void testDijkstra(){
		grafo = new Grafo();
		ruta = new HashMap<Nodo,Nodo>(); 
				
		grafo.addNodo(25, 30, "a");
		grafo.addNodo(100, 125, "b");
		grafo.addNodo(200, 300, "c");
		
		Nodo n = grafo.estaNodo(25, 30);
		Nodo n1 = grafo.estaNodo(100, 125);
		Nodo n2 = grafo.estaNodo(200, 300);
		
		grafo.addArco(n,n1,4);
		grafo.addArco(n,n2,2);
		grafo.addArco(n2,n1,1);	
		
		grafo.dijkstra(n, n1);
		ruta.put(n2, n);
		ruta.put(n1, n2);
		
		assertEquals(ruta,grafo.getRuta());
	}
	
	public void testDijkstra2(){
		grafo = new Grafo();
		ruta = new HashMap<Nodo,Nodo>(); 
		
		grafo.addNodo(231, 205, "a");
		grafo.addNodo(482, 176, "d");
		grafo.addNodo(332, 143, "b");
		grafo.addNodo(363, 245, "c");
		
		Nodo n1 = grafo.estaNodo(231, 205);
		Nodo n2 = grafo.estaNodo(482, 176);
		Nodo n3 = grafo.estaNodo(332, 143);
		Nodo n4 = grafo.estaNodo(363, 245);
		
		grafo.addArco(n1, n3, 4);
		grafo.addArco(n3, n2, 1);
		grafo.addArco(n4, n3, 1);
		grafo.addArco(n4, n2, 5);
		grafo.addArco(n3, n4, 3);
		grafo.addArco(n4, n1, 2);
		grafo.addArco(n1, n4, 2);
		
		grafo.dijkstra(n1, n2);
		
		ruta.put(n2, n3);
		ruta.put(n3, n4);
		ruta.put(n4, n1);
		
		assertEquals(ruta,grafo.getRuta());
		
	}
	
	public void testFloyd(){
		grafo = new Grafo();
		solucion = new HashSet<Arco>();
		
		grafo.addNodo(25, 30, "a");
		grafo.addNodo(100, 125, "b");
		grafo.addNodo(200, 300, "c");
		
		Nodo n = grafo.estaNodo(25, 30);
		Nodo n1 = grafo.estaNodo(100, 125);
		Nodo n2 = grafo.estaNodo(200, 300);
		
		grafo.addArco(n,n1,4);
		grafo.addArco(n,n2,2);
		grafo.addArco(n2,n1,1);
		
		grafo.floyd(n, n1);
		
		Arco a1 = grafo.estaArco(n, n2);
		Arco a2 = grafo.estaArco(n2, n1);
		solucion.add(a1);
		solucion.add(a2);
		this.assertEquals(solucion,grafo.getSolucion());
	}
	
	public void testFloyd2(){
		grafo = new Grafo();
		ruta = new HashMap<Nodo,Nodo>(); 
		
		grafo.addNodo(231, 205, "a");
		grafo.addNodo(482, 176, "d");
		grafo.addNodo(332, 143, "b");
		grafo.addNodo(363, 245, "c");
		
		Nodo n1 = grafo.estaNodo(231, 205);
		Nodo n2 = grafo.estaNodo(482, 176);
		Nodo n3 = grafo.estaNodo(332, 143);
		Nodo n4 = grafo.estaNodo(363, 245);
		
		grafo.addArco(n1, n3, 4);
		grafo.addArco(n3, n2, 1);
		grafo.addArco(n4, n3, 1);
		grafo.addArco(n4, n2, 5);
		grafo.addArco(n3, n4, 3);
		grafo.addArco(n4, n1, 2);
		grafo.addArco(n1, n4, 2);
		
		grafo.floyd(n1, n2);
		
		Arco a1 = grafo.estaArco(n3, n2);
		Arco a2 = grafo.estaArco(n4, n3);
		Arco a3 = grafo.estaArco(n1, n4);
		
		solucion.add(a1);
		solucion.add(a2);
		solucion.add(a3);
		
		this.assertEquals(solucion,grafo.getSolucion());
	}
	
	public void testKruskal(){
		grafo = new Grafo();
		solucion = new HashSet<Arco>();
		
		grafo.addNodo(305,193,"b");
		grafo.addNodo(404,254,"e");
		grafo.addNodo(208,130,"a");
		grafo.addNodo(415,369,"g");
		grafo.addNodo(315,373,"f");
		grafo.addNodo(205,254,"d");
		grafo.addNodo(392,116,"c");
		
		Nodo n1 = grafo.estaNodo(305,193); 
		Nodo n2 = grafo.estaNodo(404,254);
		Nodo n3 = grafo.estaNodo(208,130);
		Nodo n4 = grafo.estaNodo(415,369);
		Nodo n5 = grafo.estaNodo(315,373);
		Nodo n6 = grafo.estaNodo(205,254);
		Nodo n7 = grafo.estaNodo(392,116);
		
		grafo.addArco(n6, n5, 6);
		grafo.addArco(n7, n1, 8);
		grafo.addArco(n2, n4, 9);
		grafo.addArco(n5, n2, 8);
		grafo.addArco(n3, n6, 5);
		grafo.addArco(n1, n2, 7);
		grafo.addArco(n6, n2, 15);
		grafo.addArco(n1, n6, 9);
		grafo.addArco(n4, n5, 11);
		grafo.addArco(n7, n2, 5);
		grafo.addArco(n3, n1, 7);
		
		grafo.kruskal();
		
		Arco a1 = grafo.estaArco(n6, n5);
		Arco a2 = grafo.estaArco(n2, n4);
		Arco a3 = grafo.estaArco(n3, n6);
		Arco a4 = grafo.estaArco(n1, n2);
		Arco a5 = grafo.estaArco(n3, n1);
		Arco a6 = grafo.estaArco(n7, n2);
		
		solucion.add(a1);
		solucion.add(a2);
		solucion.add(a3);
		solucion.add(a4);
		solucion.add(a5);
		solucion.add(a6);
		
		this.assertEquals(solucion,grafo.getSolucion());
		
	}

}
